/* Adapted from https://github.com/argyleink/gui-challenges/blob/main/tooltips/tool-tip.css */

.tooltipWrapper {
  /* Used to power spacing and layout for RTL languages */
  --isRTL: -1;

  /* internal CSS vars */
  --_delay: 200ms;
  --_p-block: 4px;
  --_bg: var(--chalkboard-10);
  --_shadow-alpha: 8%;
  --_theme-alpha: 0.15;

  pointer-events: none;
  user-select: none;
  visibility: hidden;
  position: absolute;
  z-index: 1;

  /* The parts that will be transitioned */
  opacity: 0;
  transform: translate(var(--_x, 0), var(--_y, 0));
  transition: transform 0.15s ease-out, opacity 0.11s ease-out;
}

.tooltip {
  @apply relative;
  inline-size: max-content;
  padding: var(--_p-block) calc(2 * var(--_p-block));
  margin: 0;
  background: var(--_bg);
  @apply text-chalkboard-110;
  will-change: filter;
  filter: drop-shadow(0 1px 2px hsl(0 0% 0% / var(--_shadow-alpha)))
    drop-shadow(0 4px 6px hsl(0 0% 0% / calc(var(--_shadow-alpha) / 2)));
}

:global(.dark) .tooltip {
  --_bg: var(--chalkboard-90);
  --_theme-alpha: 40%;
  --_shadow-alpha: 16%;
  @apply text-chalkboard-10;
}

.tooltip:dir(rtl) {
  --isRTL: 1;
}

/* :has and :is are pretty fresh CSS pseudo-selectors, may not see full support */
:has(> .tooltipWrapper) {
  position: relative;
}

:is(:hover, :active) > .tooltipWrapper {
  visibility: visible;
  opacity: 1;
  transition-delay: var(--_delay);
}

:is(:focus-visible) > .tooltipWrapper.withFocus,
:focus-within > .tooltipWrapper.withFocus {
  visibility: visible;
  opacity: 1;
}

*:focus-visible .tooltipWrapper {
  --_delay: 0 !important;
}

/* prepend some prose for screen readers only */
.tooltip::before,
.tooltip::after {
  clip: rect(1px, 1px, 1px, 1px);
  clip-path: inset(50%);
  height: 1px;
  width: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
}

.tooltip::before {
  content: "; Has tooltip: ";
}

/* Sometimes there's no visible label,
 * so we'll use the tooltip as the label
*/
.tooltip:only-child::before {
  content: "";
}

.tooltip:only-child::after {
  content: " (tooltip)";
}

.top,
.bottom {
  text-align: center;
}

.tooltipWrapper.top {
  inset-inline-start: 50%;
  inset-block-end: 100%;
  --_x: calc(50% * var(--isRTL));
}

.tooltipWrapper.top-right {
  inset-block-end: 100%;
  inset-inline-end: 0;
}

.tooltipWrapper.right {
  inset-inline-start: 100%;
  inset-block-end: 50%;
  --_y: 50%;
}

.tooltipWrapper.bottom-right {
  inset-block-start: 100%;
  inset-inline-end: 0;
}

.tooltipWrapper.bottom {
  --_x: calc(50% * var(--isRTL));
  inset-inline-start: 50%;
  inset-block-start: 100%;
}

.tooltipWrapper.bottom-left {
  inset-block-start: 100%;
}

.tooltipWrapper.left {
  inset-inline-end: 100%;
  inset-block-end: 50%;
  --_y: 50%;
}

.tooltipWrapper.top-left {
  inset-block-end: 100%;
}

@media (prefers-reduced-motion: no-preference) {
  /* TOP || BLOCK-START */
  :has(
      > :is(
          .tooltipWrapper.top,
          .tooltipWrapper.top-left,
          .tooltipWrapper.top-right
        )
    ):not(:hover, :active)
    .tooltipWrapper {
    --_y: 3px;
  }

  /* RIGHT || INLINE-END */
  :has(> :is(.tooltipWrapper.right)):not(:hover, :active) .tooltipWrapper {
    --_x: calc(var(--isRTL) * -3px * -1);
  }

  /* BOTTOM || BLOCK-END */
  :has(
      > :is(
          .tooltipWrapper.bottom,
          .tooltipWrapper.bottom-left,
          .tooltipWrapper.bottom-right
        )
    ):not(:hover, :active)
    .tooltipWrapper {
    --_y: -3px;
  }

  /* BOTTOM || BLOCK-END */
  :has(> :is(.tooltipWrapper.left)):not(:hover, :active) .tooltipWrapper {
    --_x: calc(var(--isRTL) * 3px * -1);
  }
}
